const BaseService = require('./base_service.js');
const DeviceModel = require('../model/device_model.js');

class DeviceControlService extends BaseService {

  /**
   * 控制设备启停
   */
  async controlDevice(input) {
    const db = uniCloud.database();
    const collection = db.collection(DeviceModel.CL);

    // 检查设备是否存在
    const device = await collection.doc(input.deviceId).get();
    if (!device.data.length) {
      throw new Error('设备不存在');
    }

    const deviceData = device.data[0];

    // 检查设备状态
    if (deviceData.status === 0) {
      throw new Error('设备已禁用');
    }

    // 这里应该调用MQTT服务控制设备
    // 由于MQTT服务需要具体实现，这里先模拟
    let mqttResult = false;
    
    try {
      // 模拟MQTT控制
      mqttResult = await this.sendMqttCommand(deviceData.mqttTopic, input.action, input.duration);
    } catch (error) {
      throw new Error('设备控制失败: ' + error.message);
    }

    if (!mqttResult) {
      throw new Error('设备控制失败');
    }

    // 更新设备状态
    const updateData = {
      switchStatus: input.action === 'start',
      updateTime: Date.now()
    };

    if (input.action === 'start') {
      updateData.status = 2; // 使用中
    } else {
      updateData.status = 1; // 可用
    }

    await collection.doc(input.deviceId).update(updateData);

    return {
      message: `设备${input.action === 'start' ? '启动' : '停止'}成功`,
      deviceStatus: updateData.status
    };
  }

  /**
   * 控制门禁开关
   */
  async controlDoorLock(input) {
    const db = uniCloud.database();
    const collection = db.collection(DeviceModel.CL);

    // 检查门禁设备是否存在
    const doorLock = await collection.where({
      type: 'door',
      _id: input.doorLockId
    }).get();

    if (!doorLock.data.length) {
      throw new Error('门禁设备不存在');
    }

    const doorLockData = doorLock.data[0];

    // 这里应该调用MQTT服务控制门禁
    let mqttResult = false;
    
    try {
      // 模拟MQTT控制
      mqttResult = await this.sendMqttCommand(doorLockData.mqttTopic, input.action);
    } catch (error) {
      throw new Error('门禁控制失败: ' + error.message);
    }

    if (!mqttResult) {
      throw new Error('门禁控制失败');
    }

    return {
      message: `门禁${input.action === 'open' ? '开启' : '关闭'}成功`,
      action: input.action
    };
  }

  /**
   * 获取设备状态
   */
  async getDeviceStatus(deviceId) {
    const db = uniCloud.database();
    const collection = db.collection(DeviceModel.CL);

    const device = await collection.doc(deviceId).get();
    if (!device.data.length) {
      throw new Error('设备不存在');
    }

    return device.data[0];
  }

  /**
   * 发送MQTT命令（模拟实现）
   */
  async sendMqttCommand(topic, action, duration = null) {
    // 这里应该实现真实的MQTT通信
    // 由于MQTT服务需要具体配置，这里先返回成功
    console.log(`发送MQTT命令: ${topic}, 动作: ${action}, 时长: ${duration}`);
    
    // 模拟网络延迟
    await new Promise(resolve => setTimeout(resolve, 1000));
    
    return true;
  }
}

module.exports = DeviceControlService;
